package com.woniu.service.impl;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.entity.ProSpence;
import com.woniu.entity.vo.ProSpenceVo;
import com.woniu.entity.wrapperinterface.AllProSpence;
import com.woniu.mapper.ProSpenceMapper;
import com.woniu.service.IProSpenceService;
import com.woniu.util.EmptyUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author hyl,fzn
 * @since 2022-08-28
 * 这里的判断可以优化，可以提取为一个工具类的静态方法
 */
@Transactional(rollbackFor = Exception.class)
@Service
@Slf4j
public class ProSpenceServiceImpl extends ServiceImpl<ProSpenceMapper, ProSpence> implements IProSpenceService {
    @Autowired
    private ProSpenceMapper psm;

    @Override
    public void addProSpence(ProSpence proSpence) {
        if(proSpence.getSpenId()!=null && proSpence.getSpenId()>0
        && proSpence.getProId()!=null && proSpence.getProId()>0
        && proSpence.getCateId()!=null && proSpence.getCateId()>0
        ){
            psm.addProSpence(proSpence);
        }else{
            log.debug("proSpence:{}","传入的信息不符合规定，请检查");
        }

    }


    @Override
    public void updateProSpence(ProSpence proSpence) {
        boolean judge= (proSpence.getSpenId()!=null && proSpence.getSpenId()>0)
                || (proSpence.getProId()!=null && proSpence.getProId()>0);
        if( judge) {
            psm.updateProSpence(proSpence);
        }else{
            log.debug("proSpence:{}","传入的信息不符合规定，请检查");
        }
    }


    @Override
    public ProSpence selectOneSpence(ProSpence proSpence) {
        boolean judge= (proSpence.getSpenId()!=null && proSpence.getSpenId()>0)
                || (proSpence.getProId()!=null && proSpence.getProId()>0);
        if( judge) {
            return psm.selectOneSpence(proSpence);
        }else{
            log.debug("proSpence:{}","传入的信息不符合规定，请检查");
            return null;
        }

    }

    @Override
    public List<ProSpence> selectProSpences(ProSpence proSpence) {
        boolean judge= (proSpence.getSpenId()!=null && proSpence.getSpenId()>0)
                || (proSpence.getProId()!=null && proSpence.getProId()>0);
        if( judge) {
            return psm.selectProSpences(proSpence);
        }else{
            log.debug("proSpence:{}","传入的信息不符合规定，请检查");
            return null;
        }

    }

    @Override
    public void deleteProSpence(ProSpence proSpence) {
        boolean judge= proSpence.getSpenId()!=null && proSpence.getSpenId()>0;
        if( judge) {
            psm.deleteProSpence(proSpence);
        }else{
            log.debug("proSpence:{}","传入的信息不符合规定，请检查");
        }
    }

    @Override
    public Page<ProSpence> getAnyProSpenceWithPage(Integer pageNum, Integer pageSize,AllProSpence aps) {
        Page<ProSpence> page = new Page<>(pageNum,pageSize);
        ProSpenceVo psv = (ProSpenceVo) aps;
        return psm.getAnyProSpenceWithPage(page,getProSpenceWrapper(psv));
    }

    /**
     * todo 为了方便，可以将对应的vo类继承ProSpence类（接口好像更方便），这样就可以传到这个这个方法中
     * 这里使用了断言，需要在虚拟机加入'-ea -Dfile.encoding=UTF-8' 命令
     * 但是不建议用，因为断言的出错会直接终止程序
     * 所以尽量使用Exception
     *
     * 但这里因为有一个if...else...判断，所以不用担心这个，这里使用断言只不过为了方便调用方法
     * @param proSpence
     * @return
     */
    public static QueryWrapper<ProSpence> getProSpenceWrapper(AllProSpence proSpence){
        QueryWrapper<ProSpence> wrapper = new QueryWrapper<>();
        ProSpenceVo psv = null;
        // 强转,保证类型有效性
        if(proSpence instanceof ProSpenceVo || proSpence instanceof ProSpence){
            psv = (ProSpenceVo)proSpence;
        }

        // 如果为空，默认查询全部
        if(EmptyUtil.isEmpty(proSpence)){
            // 简单sql注入，恒等式
            wrapper.eq("1","1");
            return wrapper;
        }
        // 不为空
        else{
            // 断言
            assert psv != null :"这里是断言1，传进来的参数为空";
            // 根据流水id查
            if(EmptyUtil.isNoEmpty(psv.getSpenId())){
                wrapper.eq("spen_id",psv.getSpenId());
            }
            // 根据项目id查，因为在mapper的连表查询里面将pro_spence的pro_id列使用了别名pro_id2，所以下面也是用pro_id2
            if(EmptyUtil.isNoEmpty(psv.getProId())){
                wrapper.eq("ps.pro_id",psv.getProId());
            }
            // 根据种类id查
            if(EmptyUtil.isNoEmpty(psv.getCateId())){
                wrapper.eq("cate_id",psv.getCateId());
            }

            /*以下用于条件筛选的时候*/

            // 根据使用日期查
            if(EmptyUtil.isNoEmpty(psv.getCateId())){
                // 如果开始时间不为空，则用于判断大于某个指定日期
                if(EmptyUtil.isNoEmpty(psv.getBeginDateJudgeType())){
                    wrapper.gt("cate_id",psv.getBeginDate());
                }
                if(EmptyUtil.isNoEmpty(psv.getEndDateJudgeType())){
                    wrapper.lt("cate_id",psv.getEndDate());
                }
            }

            // 根据使用金额查
            if(EmptyUtil.isNoEmpty(psv.getSpenPrice())){
                // 如果开始时间不为空，则用于判断大于某个指定日期
                if(EmptyUtil.isNoEmpty(psv.getGtSpendPrice())){
                    wrapper.gt("spen_price",psv.getMinPrice());
                }
                if(EmptyUtil.isNoEmpty(psv.getLtSpendPrice())){
                    wrapper.lt("spen_price",psv.getMaxPrice());
                }
            }
        }
        return wrapper;
    }

    @Override
    public List<ProSpence> getAnyProSpences(AllProSpence aps) {
        return psm.getAnyProSpence(getProSpenceWrapper(aps));
    }

    @Override
    public Page<ProSpence> getAllProSpenceWithPage(Integer pageNum, Integer pageSize) {
        Page<ProSpence> page = new Page<>(pageNum,pageSize);
        return psm.getAllProSpenceWithPage(page);

    }
}
